package com.zhuss.lock;

import java.util.concurrent.TimeUnit;

/**
 * Lock 分布式锁
 * 统一封装分布式锁接口
 * @Author zhushanshuo
 * @Date 2024-08-07 10:51:15
 */
public interface Lock {

    /**
     * 支持可重入
     * 加锁，无阻塞
     * @param key
     * @param currentThreadId
     * @param expire
     * @return
     */
    Boolean tryDistributedLock(String key, Long currentThreadId, long expire);

    /**
     * 支持可重入
     * 加锁，有阻塞
     * @param key
     * @param currentThreadId
     * @param expire
     * @param timeoutMill
     * @return
     */
    Boolean distributedLock(String key, Long currentThreadId, long expire, long timeoutMill);

    /**
     * 支持可重入
     * 解锁
     * @param key
     * @param currentThreadId
     * @return
     */
    Boolean unlock(String key, Long currentThreadId);

    /**
     * 加锁，无阻塞
     * @param key
     * @param expire
     * @param lockTimeUnit
     * @return
     */
    @Deprecated
    Boolean tryDistributedLock(String key, long expire, TimeUnit lockTimeUnit);

    /**
     * 加锁，有阻塞
     * @param key
     * @param expire
     * @param lockTimeUnit
     * @param timeoutMill
     * @return
     */
    @Deprecated
    Boolean distributedLock(String key, long expire, TimeUnit lockTimeUnit, long timeoutMill);

    /**
     * 解锁
     * @param key
     * @return
     */
    @Deprecated
    Boolean unlock(String key);

    /**
     * 加锁，无阻塞
     * @param name
     * @param expire
     * @return
     */
    String tryLock(String name, long expire);

    /**
     * 加锁，有阻塞
     * @param name
     * @param expire
     * @param timeout
     * @return
     */
    String lock(String name, long expire, long timeout);

    /**
     * 解锁
     * @param name
     * @param token
     * @return
     */
    boolean unlock(String name, String token);




}
